package com.tx.service;

import com.tx.dao.AccountInfoDao;
import com.tx.dao.ProductInfoDao;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;

@Component
public class PayServiceImpl implements PayService {

	@Autowired
	private AccountInfoDao accountInfoDao;

	@Autowired
	private ProductInfoDao productInfoDao;


//	@Transactional
	public void pay(String accountId, double money) {
		// 查询余额
		double balance = accountInfoDao.queryBalanceByUserId(accountId);

		// 余额不足
		if (new BigDecimal(balance).compareTo(new BigDecimal(money)) < 0) {
			throw new RuntimeException("余额不足");
		}


		/**
		 * 默认情况下 Spring 中的事务处理只对 RuntimeException 异常进行回滚，所以如果此处将
		 * RuntimeException 替换成普通的 Exception 不会产生回滚效果。
		 */
		// 更新余额
		int retVal = accountInfoDao.updateAccountBalance(accountId, money);

		// 更新库存
		((PayService) AopContext.currentProxy()).updateProductStore(1);
//		if (true) {
//			throw new RuntimeException("故意的");
//		}
	}

//	@Transactional(propagation = Propagation.NESTED)
	public void updateProductStore(Integer productId) {
		productInfoDao.updateProductInfo(productId);
		if (true) {
			throw new RuntimeException("故意的");
		}
	}
}
